﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using BUS;
using DTO;
namespace GUI
{
    public partial class frmDonDatHang : Form
    {
        public frmDonDatHang()
        {
            
            InitializeComponent();
            
            
        }

        private void frmDonDatHang_Load(object sender, EventArgs e)
        {
            LayDanhSachMatHang();
            LayDanhSachDonViTinh();
            KhoiTao();
  
        }

        int i = 0;
        private void cbbTenMatHang_SelectedIndexChanged(object sender, EventArgs e)
        {
            i++;
            if (i <=2 )
                return;
            int maMH = Convert.ToInt32(cbbTenMatHang.SelectedValue.ToString());
            LayDanhSachXuatXuTheoMatHang(maMH);
            
        }
        int j = 0;
        private void cbbXuatXu_SelectedIndexChanged(object sender, EventArgs e)
        {
            j++;
            if (j <= 2)
                return;
            int maMH =  Convert.ToInt32(cbbTenMatHang.SelectedValue.ToString());
            int maXX =  Convert.ToInt32(cbbXuatXu.SelectedValue.ToString());
            LaySoLuongTheoMatHang(maMH, maXX);
            LayGiaTheoMatHang(maMH, maXX);
        }
       
        //double tongtien = 0;
        //double tratruoc = 0;
        //ChiTietHoaDonDTO ctDTO = new ChiTietHoaDonDTO();
        // ----------------------các hàm xử lý hỗ trợ cho button ThemMatHang ---------------------------------------------------
        private void btnThemMatHang_Click(object sender, EventArgs e)
        {
            int maMH = int.Parse(cbbTenMatHang.SelectedValue.ToString());
            int maXX = int.Parse(cbbXuatXu.SelectedValue.ToString());
            int index = KiemTraMatHangDaCoTrongDGV(maMH, maXX);
            if ( index == -1)
            {
                ThemMatHangXuongDGV();
            }
            else
            {
                DialogResult result = MessageBox.Show("Mặt hàng này đã được thêm. Bạn có muốn cập nhật lại .!", "Thông báo ", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
                if (result == DialogResult.OK)
                {
                    dgvDanhSachMatHang.Rows[index].Cells[4].Value = txtSoLuong.Text;
                    dgvDanhSachMatHang.Rows[index].Cells[5].Value = txtDonGia.Text;
                    dgvDanhSachMatHang.Rows[index].Cells[6].Value = int.Parse(txtSoLuong.Text) * double.Parse(txtDonGia.Text);
                    dgvDanhSachMatHang.Refresh();
                }
            }
            DonGiaMatHang();
            ThietLap();
        }
        private void DonGiaMatHang()
        {

            double tongtien = TinhTongTien();
            double tratruoc = double.Parse(txtTraTruoc.Text);
            txtTongTien.Text = (tongtien + double.Parse(txtPhiGiaoHang.Text)).ToString();
            txtConNo.Text = (tongtien - tratruoc + double.Parse(txtPhiGiaoHang.Text)).ToString();
            
        }
        private double TinhTongTien()
        {
            double tongtien = 0;
            int count = dgvDanhSachMatHang.Rows.Count;
            if (count == 0)
                return tongtien;
            else
            {
                for (int dong = 0; dong < count; dong++)
                {
                    double thanhtien = double.Parse(dgvDanhSachMatHang.Rows[dong].Cells[6].Value.ToString());
                    tongtien += thanhtien;
                }
            }
            return tongtien;
        }
        private void ThemMatHangXuongDGV()  //Hàm thêm 1 mặt hàng xuống datagirdview
        {
            MatHangBUS mhBUS = new MatHangBUS();
            XuatXuBUS xxBUS = new XuatXuBUS();
            DonViTinhBUS dvBUS = new DonViTinhBUS();
            int stt = dgvDanhSachMatHang.Rows.Count + 1;
            string tenmh = mhBUS.LayTenMatHangTheoMa(int.Parse(cbbTenMatHang.SelectedValue.ToString()));
            string tenxx = xxBUS.LayTenXuatXuTheoMa(int.Parse(cbbXuatXu.SelectedValue.ToString()));
            string dvtinh = dvBUS.LayTenDonViTinh(int.Parse(cbbDonViTinh.SelectedValue.ToString()));
            int soluong = int.Parse(txtSoLuong.Text);
            double dongia = double.Parse(txtDonGia.Text);
            double thanhtien = soluong * dongia;
            dgvDanhSachMatHang.Rows.Add(stt, tenmh, tenxx, dvtinh, soluong, dongia, thanhtien);
 
        }
        private int KiemTraMatHangDaCoTrongDGV(int maMH, int maXX)   //hàm kiểm tra xem mặt hàng đã tồn tại trong datagirdview chưa
        {                                                           // trả về 0 nếu chưa tồn tại, nếu tồn tại trả về index
            int count = dgvDanhSachMatHang.Rows.Count;
            int index = -1;
            if (count == 0)
                return index;
            else
            {
                MatHangBUS mhBUS = new MatHangBUS();
                XuatXuBUS xxBUS = new XuatXuBUS();
                string tenMH = mhBUS.LayTenMatHangTheoMa(maMH);
                string tenXX = xxBUS.LayTenXuatXuTheoMa(maXX);
                for (int dong = 0; dong < count; dong++)
                {
                    string _tenmh = dgvDanhSachMatHang.Rows[dong].Cells[1].Value.ToString();
                    string _tenxx = dgvDanhSachMatHang.Rows[dong].Cells[2].Value.ToString();
                    if (tenMH == _tenmh && tenXX == _tenxx)
                    {
                        index = dong;
                        break;
                    }
                }
            }
            return index; ;
        }        
        /// <summary>
        /// --------------------------------------------------
        /// </summary>
    
        private void btnLamMoi_Click(object sender, EventArgs e)
        {
            SuKienLamMoi();
        }
        private void SuKienLamMoi()
        {
            KhoiTao();
            ThietLap();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCapNhatDuLieu_Click(object sender, EventArgs e)
        {   // khởi tạo giá trị
            HoaDonBanHangBUS hdBUS = new HoaDonBanHangBUS();
            HoaDonBanHangDTO hdDTO = new HoaDonBanHangDTO();
            ChiTietHoaDonBUS ctBUS = new ChiTietHoaDonBUS();
          
            MatHangBUS mhBUS = new MatHangBUS();
            XuatXuBUS xxBUS = new XuatXuBUS();
            DonViTinhBUS dvBUS = new DonViTinhBUS();

            KhachHangDTO khDTO = new KhachHangDTO();
            KhachHangBUS khBUS = new KhachHangBUS();
            // cập nhật thông tin khách hàng
            khDTO.TenKhachHang = txtTenNguoiNhan.Text.Trim();
            khDTO.SoDienThoai = txtSoDienThoai.Text.Trim();
            khDTO.DiaChi = txtDiaChiGiao.Text.Trim();
            bool khMoi = false;
            int maKH = khBUS.KiemTraTonTaiKhachHang(khDTO.TenKhachHang, khDTO.SoDienThoai, khDTO.DiaChi);
            if (maKH == 0)
            {
                maKH = khBUS.LayMaKhachHang() + 1;
                khMoi = true;
            }
            khDTO.MaKhachHang = maKH;

            int maHD = hdBUS.LayMaHoaDonBanHang() + 1;
            hdDTO.MaHoaDon = maHD;
            hdDTO.NgayLap = NgayGio(dtpGioLap, dtpNgayLap);
            hdDTO.MaKhachHang = maKH;//do đơn đặt hàng ko có khách hàng chỉ lưu người nhận nên set =0;
            hdDTO.Vat = "";
            hdDTO.TenNguoiNhan = khDTO.TenKhachHang;
            hdDTO.SdtNguoiNhan = khDTO.SoDienThoai;
            hdDTO.MaSoThue = txtMaSoThue.Text;
            hdDTO.GiaoDen = khDTO.DiaChi;
            hdDTO.PhiGiaoHang = double.Parse(txtPhiGiaoHang.Text.Trim());
            hdDTO.ThanhTien = double.Parse(txtTongTien.Text.Trim());
            hdDTO.TraTruoc = double.Parse(txtTraTruoc.Text.Trim());
            hdDTO.ConNo = double.Parse(txtConNo.Text.Trim());
            hdDTO.NgayGiao = NgayGio(dtpGioGiao, dtpNgayGiao);
            hdDTO.TinhTrang = 0; // 0 chưa giao  1. đã giao  2. đã thanh toán nợ   -1.hủy hóa đơn
            hdDTO.LoaiHoaDon = 0; // 0 đơn đặt hàng 1. hóa đơn

            List<ChiTietHoaDonDTO> listHD = new List<ChiTietHoaDonDTO>();
            int somathang = dgvDanhSachMatHang.Rows.Count;
            if (somathang >= 1)
            {
                int dong = 0;
                int maCT = ctBUS.LayMaChiTietHoaDon() + 1;
                while (dong < somathang)
                {   //cập nhật thông tin mặt hàng
                    // thêm từng dòng trên datagirdview, mỗi dòng tương ứng với 1 mặt hàng
                    ChiTietHoaDonDTO ctDTO = new ChiTietHoaDonDTO();
                    ctDTO.MaChiTietHoaDon = maCT + dong;
                    ctDTO.MaHoaDon = maHD;
                    string tenMH = dgvDanhSachMatHang.Rows[dong].Cells[1].Value.ToString();
                    ctDTO.MaMatHang = mhBUS.LayMaMatHangTheoTen(tenMH);
                    string tenXX = dgvDanhSachMatHang.Rows[dong].Cells[2].Value.ToString();
                    ctDTO.MaXuatXu = xxBUS.LayMaXuatXuTheoTen(tenXX);
                    string tenDV = dgvDanhSachMatHang.Rows[dong].Cells[3].Value.ToString();
                    ctDTO.MaDonViTinh = dvBUS.LayMaDonViTinh(tenDV);
                    ctDTO.SoLuong = int.Parse(dgvDanhSachMatHang.Rows[dong].Cells[4].Value.ToString());
                    ctDTO.DonGia = double.Parse(dgvDanhSachMatHang.Rows[dong].Cells[5].Value.ToString());
                    listHD.Add(ctDTO);
                    dong++;
                }
                
            }
            // bắt đầu ghi xuống cơ sở dữ liệu
            bool error = false;
            string messKH = "";
            if (khMoi)
                messKH = khBUS.ThemKhachHang(khDTO);
            if (messKH == "")
            {
                // bảng HOADON
                string messHD = hdBUS.ThemHoaDonBanHang(hdDTO);
                if (messHD == "")
                {
                    //bảng CHITIETHOADON
                    string messCT = "";
                    bool errCT = false;
                    for (int m = 0; (m < listHD.Count) && (errCT == false); m++)
                    {
                        messCT = ctBUS.ThemChiTietHoaDon(listHD[m]);
                        if (messCT != "") // nếu có lỗi xảy ra, quay lại xóa những chitiethoadon đã thêm
                        {
                            errCT = true;
                            error = true;
                            m = m - 1;
                            while (m >= 0)
                            {
                                ctBUS.XoaChiTietHoaDon(listHD[m].MaChiTietHoaDon);
                                m--;
                            }
                        }
                    }// end for
                    if (messCT == "")
                    {
                        //bảng MATHANG
                        bool errMH = false;
                        string messMH = "";
                        for (int k = 0; (k < listHD.Count) && (errMH == false); k++)
                        {
                            // cập nhật lại số lượng mặt hàng
                            messMH = mhBUS.CapNhatSoLuong(listHD[k].MaMatHang, listHD[k].MaXuatXu, listHD[k].SoLuong, errMH);
                            if (messMH != "")   // nếu có lỗi xảy ra, quay lại cập nhật lại số lượng những mặt hàng đã thêm
                            {
                                errMH = true;
                                error = true;
                                k = k - 1;
                                while (k >= 0)
                                {
                                    mhBUS.CapNhatSoLuong(listHD[k].MaMatHang, listHD[k].MaXuatXu, listHD[k].SoLuong, errMH);
                                    k--;
                                }
                                XoaChiTietHoaDonLoi(listHD, ctBUS); // quay lại xóa dữ liệu đã insert ở bảng CHITIETHOADON
                            }//endif

                        }
                        if (error)  //// quay lại xóa dữ liệu đã insert ở bảng HOADON
                        {
                            hdBUS.XoaHoaDon(hdDTO.MaHoaDon);
                        }
                    } //cuối messCT ==""
                    else
                    {
                        hdBUS.XoaHoaDon(hdDTO.MaHoaDon);
                        lbLoi.Visible = true;
                        lbLoi.Text = "Có lỗi về thông tin mặt hàng .!";
                    }
                    if(error)
                    {
                        khBUS.XoaKhachHang(khDTO.MaKhachHang);
                    }
                }// cuối messHD ==""
                else
                {
                    khBUS.XoaKhachHang(khDTO.MaKhachHang);
                    lbLoi.Visible = true;
                    lbLoi.Text = "Có lỗi về thông tin đơn đặt hàng .!";
                }
            }// cuối messKH ==""
            if (!error)
            {
                MessageBox.Show("Lưu dữ liệu thành công .!");
                SuKienLamMoi();
            }
        }
        private void XoaChiTietHoaDonLoi(List<ChiTietHoaDonDTO> listCT, ChiTietHoaDonBUS ctBUS)
        {
            int m = listCT.Count - 1;
            while (m >= 0)
            {
                ctBUS.XoaChiTietHoaDon(listCT[m].MaChiTietHoaDon);
                m--;
            }
        }
        private DateTime NgayGio(DateTimePicker dtpgio, DateTimePicker dtpngay)
        {
            DateTime ngaygio = new DateTime(dtpngay.Value.Year, dtpngay.Value.Month, dtpngay.Value.Day, dtpgio.Value.Hour, dtpgio.Value.Minute, dtpgio.Value.Second);
            return ngaygio;
        }
        //--------------------------------------------------------------//
        /// <summary>
        /// ---------------------------------------------------------
        /// </summary>
 
        private void btnXoaMatHang_Click(object sender, EventArgs e)
        {
            int dong = dgvDanhSachMatHang.SelectedCells.Count;
            if (dong == 0)
                return;
            dong = dgvDanhSachMatHang.SelectedCells[0].RowIndex;
            dgvDanhSachMatHang.Rows.RemoveAt(dong);
        }

        private void btnXuatTapTin_Click(object sender, EventArgs e)
        {

        }

        private void btnDanhSachHoaDon_Click(object sender, EventArgs e)
        {

        }
        private void btnThoat_Click(object sender, EventArgs e)
        {
            Close();
        }
        private void LayDanhSachMatHang()
        {
            MatHangBUS mhBUS = new MatHangBUS();
            cbbTenMatHang.DataSource = mhBUS.LayDanhSachTenMatHang();
            cbbTenMatHang.ValueMember = "MaMatHang";
            cbbTenMatHang.DisplayMember = "TenMatHang";

        }
        private void LayDanhSachXuatXuTheoMatHang(int maMH)
        {
           MatHangBUS mhBUS = new MatHangBUS();
           cbbXuatXu.DataSource = mhBUS.LayXuatXuTheoMatHang(maMH);
           cbbXuatXu.ValueMember = "MaXuatXu";
           cbbXuatXu.DisplayMember = "TenXuatXu";
        }
        private void LaySoLuongTheoMatHang(int maMH, int maXX)
        {
            MatHangBUS mhBUS = new MatHangBUS();
            lbSoLuongTon.Text ="Tồn kho: " + mhBUS.LaySoLuongTheoMatHang(maMH, maXX).ToString();
        }
        private void LayDanhSachDonViTinh()
        {
            DonViTinhBUS dvBUS = new DonViTinhBUS();
            cbbDonViTinh.DataSource = dvBUS.LayDanhSachDonViTinh();
            cbbDonViTinh.DisplayMember = "TenDonViTinh";
            cbbDonViTinh.ValueMember = "MaDonViTinh";
        }
        private void LayGiaTheoMatHang(int maMH, int maXX)
        {
            MatHangBUS mhBUS = new MatHangBUS();
            txtDonGia.Text =  mhBUS.LayGiaTheoMatHang(maMH, maXX).ToString();
        }
        // ---------------------------------------------------------------------------------------
        /// <summary>
        /// ----- Nhóm hàm khởi tạo khi form được gọi ---------------------------
        /// </summary>
 
        private void KhoiTao()
        {
            txtTenNguoiNhan.Clear();
            txtSoDienThoai.Clear();
            txtMaSoThue.Clear();
            txtDiaChiGiao.Clear();
            txtPhiGiaoHang.Text = "0";
            txtTongTien.Text = "0";
            txtTraTruoc.Text = "0";
            txtConNo.Text = "0";
            lbLoi.Visible = false;
            txtSoLuong.Text = "1";
            dgvDanhSachMatHang.Rows.Clear();
        }
        private void ThietLap()
        {
            cbbTenMatHang.SelectedIndex = 0;
            cbbXuatXu.SelectedIndex = 0;
            cbbDonViTinh.SelectedIndex = 0;
            txtSoLuong.Text = "1";
        }
        private void txtDonGia_MouseClick(object sender, MouseEventArgs e)
        {
            txtDonGia.Clear();
        }

        private void txtSoLuong_MouseClick(object sender, MouseEventArgs e)
        {
            txtSoLuong.Clear();
        }

        private void txtPhiGiaoHang_MouseClick(object sender, MouseEventArgs e)
        {
            txtPhiGiaoHang.Clear();
        }

        private void txtTraTruoc_MouseClick(object sender, MouseEventArgs e)
        {
            txtTraTruoc.Clear();
        }

        private void cbbTenMatHang_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = (char)0;
        }

        private void txtPhiGiaoHang_KeyPress(object sender, KeyPressEventArgs e)
        {
            string decimalString = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
            char decimalChar = Convert.ToChar(decimalString);

            if (Char.IsDigit(e.KeyChar) || Char.IsControl(e.KeyChar)) { }
            else if (e.KeyChar == decimalChar && txtPhiGiaoHang.Text.IndexOf(decimalString) == -1)
            { }
            else
            {
                e.Handled = true;
            }
        }

       
       

       
    }
}
